package com.sjms._00_设计原则;

/**
 * 1.单一职责
 * 2.接口隔离
 * 3.依赖倒置（面向接口编程）
 * 4.里氏替换
 * 5.开闭原则
 * 6.迪米特（好朋友原则）
 * 7.合成复用
 * <p>
 * 代码满足条件解析
 * <p>
 * 1.单一职责：其中，制造接口与刷漆接口已经分离。因为生产椅子需要刷漆，生产桌子不需要刷漆。
 * <p>
 * 2.接口隔离：其中，制造方法与刷漆方法，抽象到了两个接口中，实现接口最小化，满足隔离条件。
 * <p>
 * 3.依赖倒置：已经满足，面向接口编程，且如果需要扩展，只需要创建一个生产厂商类即可，不会变动旧代码。
 * <p>
 * 4.里氏替换：使用的是接口，而不是继承木材类，降低继承带来的耦合增强。
 * <p>
 * 5.开闭原则：新增生产厂商生产家具，只需要创建一个生产厂商类即可，不会变动旧代码，满足对扩展开放，对修改关闭。
 * <p>
 * 6.迪米特原则：其中，木材类是通过参数传递，而不是内部new出来，满足 好朋友原则。
 * <p>
 * 7.合成复用：木材类对象作为成员变量，通过构造函数参数传递，而不是使用继承木材类后实现，满足合成复用
 */
interface 制造接口 {
    void 制造();
}

interface 刷漆接口 {
    void 刷漆();
}

class 木材类 {
    public String name;

    public 木材类(String name) {
        this.name = name;
        System.out.println("当前木材：" + name);
    }
}

class 桌子厂商 implements 制造接口 {
    木材类 mc;

    public 桌子厂商(木材类 mc) {
        this.mc = mc;
    }

    @Override
    public void 制造() {
        System.out.println("使用 " + mc.name + " 制造了一张桌子");
        System.out.println();

    }
}

class 椅子厂商 implements 制造接口, 刷漆接口 {
    木材类 mc;

    public 椅子厂商(木材类 mc) {
        this.mc = mc;
    }

    @Override
    public void 制造() {
        System.out.println("使用 " + mc.name + " 制造了一把椅子");
        this.刷漆();
    }

    @Override
    public void 刷漆() {
        System.out.println("椅子材料 " + mc.name + " ，状态：刷漆完成");
        System.out.println();
    }

}

//... 猫窝厂商
//... 柜子厂商
//... 木板床厂商

public class 满足设计原则测试 {

    public static void main(String[] args) {

        //桌子厂商-制造桌子
        木材类 ys = new 木材类("杨树");
        桌子厂商 zz = new 桌子厂商(ys);
        zz.制造();

        //椅子厂商-制造椅子
        木材类 ss = new 木材类("松树");
        椅子厂商 yz = new 椅子厂商(ss);
        yz.制造();

        //...  猫窝厂商 制造 纯木猫窝
        //... 柜子厂商  制造 柜子
        //... 木板床厂商  制造 木板床

    }

}
